#ifndef ARP_H
#define ARP_H

#include "net.h"

// 表示 ARP 报文可以在哪种类型的网络上传输，值为 1 时表示为以太网地址
#define ARP_HW_ETHER 0x1  // 以太网

// 指定本次 ARP 报文类型。1 标识 ARP 请求报文，2 标识 ARP 应答报文
#define ARP_REQUEST 0x1   // ARP请求包
#define ARP_REPLY 0x2     // ARP响应包

#pragma pack(1)
typedef struct arp_pkt {
    uint16_t hw_type16;               // 硬件类型：ARP 报文可以在哪种类型的网络上传输
    uint16_t pro_type16;              // 上层协议类型：硬件地址要映射的协议地址类型，映射 IP 地址时的值为 0x0800
    uint8_t hw_len;                   // MAC硬件地址长度
    uint8_t pro_len;                  // IP协议地址长度
    uint16_t opcode16;                // 报文类型：请求/响应
    uint8_t sender_mac[NET_MAC_LEN];  // 源MAC地址
    uint8_t sender_ip[NET_IP_LEN];    // 源IP地址
    uint8_t target_mac[NET_MAC_LEN];  // 目的MAC地址
    uint8_t target_ip[NET_IP_LEN];    // 目的IP地址
} arp_pkt_t;

#pragma pack()

void arp_init();
void arp_print();
void arp_in(buf_t *buf, uint8_t *src_mac);
void arp_out(buf_t *buf, uint8_t *ip);
void arp_req(uint8_t *target_ip);
void arp_resp(uint8_t *target_ip, uint8_t *target_mac);
#endif